//
//  ViewController.m
//  drag
//
//  Created by 梁羽 on 2025/6/28.
//

#import "ViewController.h"
#import "ViewA.h"
#import <PDFKit/PDFKit.h>

@interface ViewController ()
@property (nonatomic, strong) ViewA *viewA;
@property (nonatomic, strong) PDFView *pdfView;
@property (nonatomic, strong) PDFDocument *pdfDocument;

@property (nonatomic, assign) NSInteger type; //1-圆 2-矩形 3-直线 4-箭头
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupPDFView];
    
    // 创建视图A并添加到控制器视图
    _viewA = [[ViewA alloc] initWithFrame:CGRectMake(20, 100, 300, 400)];
    _viewA.viewC.pdfView = self.pdfView;
    _viewA.viewD.pdfView = self.pdfView;
    _viewA.viewD.pdfScaleFactor = self.pdfView.scaleFactor;
    [self.view addSubview:_viewA];
    
    // 添加说明标签
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 50, 300, 30)];
    label.text = @"拖动白色视图移动椭圆形";
    [self.view addSubview:label];
    
    // 设置菜单栏按钮动作
    [self setupMenuActions];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pathEnd:) name:@"8888-9999" object:nil];
    //[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rectanglePathEnd:) name:@"8888-0000" object:nil];
}

- (void)setupPDFView {
    // 初始化PDFView
    self.pdfView = [[PDFView alloc] initWithFrame:self.view.bounds];
    self.pdfView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.view addSubview:self.pdfView];
    
    // 加载PDF文档
    NSURL *pdfURL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"pdf"];
    self.pdfDocument = [[PDFDocument alloc] initWithURL:pdfURL];
    self.pdfView.document = self.pdfDocument;
    
    // 设置显示模式
    self.pdfView.displayMode = kPDFDisplaySinglePage;
    self.pdfView.autoScales = YES;
}

- (void)setupMenuActions {
    // 边框颜色按钮
    [self.viewA.menuBar.borderColorButton addTarget:self action:@selector(changeBorderColor) forControlEvents:UIControlEventTouchUpInside];
    
    // 边框粗细按钮
    [self.viewA.menuBar.borderWidthButton addTarget:self action:@selector(changeBorderWidth) forControlEvents:UIControlEventTouchUpInside];
}

- (void)changeBorderColor {
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"选择边框颜色"
                                                                 message:nil
                                                          preferredStyle:UIAlertControllerStyleActionSheet];
    
    NSArray *colors = @[@"红色", @"蓝色", @"绿色", @"紫色", @"黑色"];
    NSArray *colorValues = @[[UIColor redColor], [UIColor blueColor], [UIColor greenColor], [UIColor purpleColor], [UIColor blackColor]];
    
    for (NSInteger i = 0; i < colors.count; i++) {
        [alert addAction:[UIAlertAction actionWithTitle:colors[i]
                                                 style:UIAlertActionStyleDefault
                                               handler:^(UIAlertAction * _Nonnull action) {
            self.viewA.viewB.ellipseBorderColor = colorValues[i];
            [self.viewA.viewB setNeedsDisplay];
        }]];
    }
    
    [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
    
    [self presentViewController:alert animated:YES completion:nil];
}

- (void)changeBorderWidth {
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"选择边框粗细"
                                                                 message:nil
                                                          preferredStyle:UIAlertControllerStyleActionSheet];
    
    NSArray *widths = @[@"1像素", @"2像素", @"3像素", @"5像素", @"8像素"];
    NSArray *widthValues = @[@1, @2, @3, @5, @8];
    
    for (NSInteger i = 0; i < widths.count; i++) {
        [alert addAction:[UIAlertAction actionWithTitle:widths[i]
                                                 style:UIAlertActionStyleDefault
                                               handler:^(UIAlertAction * _Nonnull action) {
            self.viewA.viewB.ellipseBorderWidth = [widthValues[i] floatValue];
            [self.viewA.viewB setNeedsDisplay];
        }]];
    }
    
    [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
    
    [self presentViewController:alert animated:YES completion:nil];
}

- (void)addEllipseAnnotationToCurrentPage:(UIBezierPath *)ellipsePath {
    // 获取当前显示的页面
    PDFPage *currentPage = [self.pdfView currentPage];
    if (!currentPage) return;
    
    // 计算椭圆在PDF页面中的边界
    CGRect ellipseBounds = [self convertEllipseRect:ellipsePath.bounds fromView:self.viewA toPDFPage:currentPage];
    
    // 创建PDF椭圆注释
    PDFAnnotation *ellipseAnnotation = [[PDFAnnotation alloc] initWithBounds:ellipseBounds
                                                                     forType:self.type == 1 ? PDFAnnotationSubtypeCircle : (self.type == 2 ? PDFAnnotationSubtypeSquare : PDFAnnotationSubtypeLine)
                                                                  withProperties:nil];
    
    // 设置注释样式
    if (self.type == 1) {
        [ellipseAnnotation setColor:self.viewA.viewB.ellipseBorderColor];
    }else if (self.type == 2) {
        [ellipseAnnotation setColor:[UIColor redColor]];
    }else if (self.type == 3) {
        [ellipseAnnotation setColor:[UIColor cyanColor]];
    }
    
    PDFBorder *border = [[PDFBorder alloc] init];
    if (self.type == 1) {
        [border setLineWidth:self.viewA.viewB.ellipseBorderWidth];
    }else if (self.type == 2) {
        [border setLineWidth:8];
    }else if (self.type == 3) {
        [border setLineWidth:8];
    }
    [border setStyle:kPDFBorderStyleSolid];
    [ellipseAnnotation setBorder:border];
    
    // 添加到页面
    [currentPage addAnnotation:ellipseAnnotation];
}

- (void)addrectToPdf:(CGRect)rect {
    PDFPage *currentPage = [self.pdfView currentPage];
    if (!currentPage) return;
    
    CGRect bounds = [self convertEllipseRect:rect fromView:self.viewA toPDFPage:currentPage];
        
    PDFAnnotation *annotation = [[PDFAnnotation alloc] initWithBounds:bounds
                                                            forType:PDFAnnotationSubtypeLine
                                                      withProperties:nil];
    
    annotation.color = [UIColor redColor];
    annotation.border = [[PDFBorder alloc] init];
    annotation.border.lineWidth = 2.0;
    
    [currentPage addAnnotation:annotation];
}

- (CGRect)convertEllipseRect:(CGRect)rect fromView:(UIView *)view toPDFPage:(PDFPage *)page {
    // 将视图坐标系转换为PDFView坐标系
    CGRect rectInPDFView = [view convertRect:rect toView:self.pdfView];
    
    // 将PDFView坐标系转换为页面坐标系
    return [self.pdfView convertRect:rectInPDFView toPage:page];
}

// 点坐标转换
//- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view toPDFPage:(PDFPage *)page {
//    // 将视图坐标系转换为PDFView坐标系
//    CGPoint pointInPDFView = [view convertPoint:point toView:self.pdfView];
//
//    // 将PDFView坐标系转换为页面坐标系
//    return [self.pdfView convertPoint:pointInPDFView toPage:page];
//}

- (void)pathEnd:(NSNotification *)noti {
    UIBezierPath *path = noti.userInfo[@"path"];
    self.type = [NSString stringWithFormat:@"%@", noti.userInfo[@"type"]].integerValue;
    if (self.type == 3) {
        //[self addrectToPdf:CGRectFromString(noti.userInfo[@"path"])];
        NSDictionary *userInfo = noti.userInfo;
        NSValue *startValue = userInfo[@"startPoint"];
        NSValue *endValue = userInfo[@"endPoint"];
        if (startValue && endValue) {
            [self addLineToPdfFromPoint:[startValue CGPointValue]
                                toPoint:[endValue CGPointValue]];
        }
    }else {
        [self viewBDidFinishDraggingWithEllipse:path];
    }
}

- (void)viewBDidFinishDraggingWithEllipse:(UIBezierPath *)ellipsePath {
    // 将椭圆作为注释添加到PDF当前页
    [self addEllipseAnnotationToCurrentPage:ellipsePath];
}

// 新的添加直线注释的方法
- (void)addLineToPdfFromPoint:(CGPoint)startPointInView toPoint:(CGPoint)endPointInView {
    PDFPage *currentPage = [self.pdfView currentPage];
    if (!currentPage) return;
    
    // 转换坐标到PDF页面空间
    CGPoint pdfStartPoint = [self.pdfView convertPoint:startPointInView toPage:currentPage];
    CGPoint pdfEndPoint = [self.pdfView convertPoint:endPointInView toPage:currentPage];
    
    // 计算注释的bounds（需要包含整个直线）
    CGFloat minX = MIN(pdfStartPoint.x, pdfEndPoint.x);
    CGFloat maxX = MAX(pdfStartPoint.x, pdfEndPoint.x);
    CGFloat minY = MIN(pdfStartPoint.y, pdfEndPoint.y);
    CGFloat maxY = MAX(pdfStartPoint.y, pdfEndPoint.y);
    
    CGRect bounds = CGRectMake(minX, minY, maxX - minX, maxY - minY);
    
    // 创建直线注释
    PDFAnnotation *annotation = [[PDFAnnotation alloc] initWithBounds:bounds
                                                           forType:PDFAnnotationSubtypeLine
                                                     withProperties:nil];
    
    // 设置直线属性
    annotation.color = [UIColor redColor];
    annotation.border = [[PDFBorder alloc] init];
    annotation.border.lineWidth = 2.0;
    
    // 设置直线的起点和终点（相对于bounds）
    CGPoint relativeStart = CGPointMake(pdfStartPoint.x - bounds.origin.x,
                                       pdfStartPoint.y - bounds.origin.y);
    CGPoint relativeEnd = CGPointMake(pdfEndPoint.x - bounds.origin.x,
                                     pdfEndPoint.y - bounds.origin.y);
    
    // PDFAnnotation的startPoint和endPoint是相对于bounds的
    annotation.startPoint = relativeStart;
    annotation.endPoint = relativeEnd;
    
    [currentPage addAnnotation:annotation];
}

/**
 我现在有一个需求，在vc里有一个视图A，在视图A中有视图B，现在需要在B中画出一个矩形，然后可以拖动B在A中移动，请帮我实现该完整功能，提供oc代码
 
 上面给出的代码非常棒，现在我需要在这个的基础上增加功能，在视图B的四个角各增加一个按钮，可以拖拽住此按钮来变大或者缩小该椭圆图形，请帮我在上面的基础上增加这个功能
 
 上面的代码整体确实不错，但是有个小bug，就是四个橙色按钮可以拖到B的范围之外，此时四个橙色按钮的拖拽事件不会再响应了，我觉得四个橙色按钮不能超出父视图所在的区域，请按照这个逻辑帮我修改代码
 
 上面的代码非常漂亮，现在在上面的基础上做个小改动，就是在拖动四个橙色按钮到达视图B的边缘位置时，此时视图B的大小可以变大，最大为视图A的大小，同样的视图B也可以变小，就是始终为四个橙色按钮的外围大小，请按照这个逻辑帮我修改代码
 
 代码在逻辑上已经没有任何问题了，现在我要对视图B做一些UI上的改动
 1、在视图B内画一个四条边的矩形，矩形的四个角为四个橙色按钮的中心点
 2、视图B其内的椭圆要与第一步中画的矩形相切
 请按照上面两点要求帮我修改上面的代码
 
 现在我需要在上面代码的基础上增加如下的几个功能
 1、在视图A中增加一个菜单栏，菜单栏的位置出于视图B的上方且随着视图B位置的变动而变动，当视图B上方放不下时需要放在视图B的下方，菜单栏中有两个功能，第一个为修改视图B中椭圆形的边框颜色，第二个为修改视图B中椭圆形的边框粗细
 2、视图B中椭圆形的填充颜色需要设置为透明
 请按照上面的要求来修改代码
 
 基于上面的功能，我现在需要在拖拽结束时获取到椭圆形区域，并将该区域添加到PDF中，请提供者部分的代码
 
 你理解错我的需求了
 1、假设PDF已经展示在vc里面了
 2、将椭圆形作为一个圈注功能通过addAnnotation添加到pdfview的某一页当中
 请重新提供符合需求的代码
 
 
 
 基于上面椭圆形的代码，现在需要将椭圆形改为矩形，同时保留其它的所有功能，将矩形的绘制放到ViewD当中，放置矩形的容器为ViewC，请提供完整的代码
 
 根据上面的代码需要做出以下调正
 1、将ViewD删除掉，将矩形的绘制放到ViewC中
 2、矩形的绘制范围不要超过父视图的范围
 
 上面的代码非常漂亮，现在在上面的基础上做个小改动，就是在拖动四个橙色按钮到达视图C的边缘位置时，此时视图C的大小可以变大，最大为视图A的大小，同样的视图C也可以变小，就是始终为四个橙色按钮的外围大小，请按照这个逻辑帮我修改代码
 
 按照上面的方法，当拖拽矩形结束时，标注到PDF上的位置不是拖拽结束的位置，请修改这个问题
 
 现在我想在上面矩形代码的基础上增加一个功能：在矩形的每条边上增加一个灰色的按钮，大小与四个点的橙色按钮相同，当拖拽每条边上的灰色按钮时与该条变接触的两条边会拉长或缩短，根据上面的功能描述提供代码
 
 上面代码已经完成了功能，现在有一个需要优化的地方，就是当拖动左边中间按钮时右边线保持不动，同理拖动上边中间按钮时下边线也不动，右边及下边按钮的拖动逻辑也同理，请修改
 
 
 
 基于上面的容器ViewA，现在需要新建视图ViewD该视图中绘制一条直线，直线的两个端点处各有一个橙色按钮是可以拖动的，功能与椭圆与矩形一样，请完成这个代码
 
 上面的代码非常漂亮，现在在上面的基础上做个小改动，就是在拖动viewD中两个端点处的橙色按钮到达视图D的边缘位置时，此时视图D的大小可以变大，最大为视图A的大小，同样的视图D也可以变小，就是始终为两个橙色按钮的外围大小，请按照这个逻辑帮我修改ViewD中的代码
 
 
 
 我现在已经实现了一个功能，就是在一个视图上通过drawRect:绘制出了一条直线，而且在vc中已经展示出了一个PDF文件，那么我怎么将绘制的这条直线通过PDFAnnotation的方式加载到PDF文件中
 */

@end
